#include "eeprom.h"

//------------内部定义---------------
#define EE_DEVADDR_WRITE 0xA0 // 设备写地址
#define EE_DEVADDR_READ 0xA1  // 设备读地址
// static void EE_Error(uint32_t errCode)
// {
//     // 此处表示通信出错时如何处理
//     printf("EE errorCode = %d\r\n", errCode);
// }

//------------函数定义---------------
uint32_t EE_WriteByte(uint8_t dataAddr, uint8_t data)
{
    // 起始
    I2C_Start();
    // 发送: 设备写地址
    I2C_SendByte(EE_DEVADDR_WRITE);
    // 读取: 应答
    if(I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 11;
    }
    // 发送: 数据地址
    I2C_SendByte(dataAddr);
    // 读取: 应答
    if(I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 12;
    }
    // 发送: 数据
    I2C_SendByte(data);
    // 读取: 应答
    if(I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 13;
    }
    // 发送: 停止
    I2C_Stop();
    return 0;
}

uint32_t EE_ReadByte(uint8_t dataAddr, uint8_t *data)
{
    // 起始
    I2C_Start();
    // 发送: 设备写地址
    I2C_SendByte(EE_DEVADDR_WRITE);
    // 读取: 应答
    if(I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 21;
    }
    // 发送: 数据地址
    I2C_SendByte(dataAddr);
    // 读取: 应答
    if (I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 22;
    }
    // 发送: 起始信号
    I2C_Start();
    // 发送: 设备读地址
    I2C_SendByte(EE_DEVADDR_READ);
    // 读取: 应答
    if (I2C_ACK != I2C_WaitForAck())
    {
        // EE_Error(6);
        I2C_Stop();
        return 23;
    }
    // 读取: 数据
    // 发送: 应答
    *data = I2C_RecvByte(I2C_NOACK);
    // 发送: 停止
    I2C_Stop();
    return 0;
}

uint32_t EE_WritePage(uint8_t startAddr, uint8_t *buf, uint8_t len)
{
    // 参数校验
    if (len == 0 || len > 8)
        return 31; // 最多写一页
    // 发送: 起始信号
    I2C_Start();
    // 发送: 设备写地址
    I2C_SendByte(EE_DEVADDR_WRITE);
    // 接收: 应答
    if (I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 32;
    }
    // 发送: 数据地址
    I2C_SendByte(startAddr);
    // 接收: 应答
    if (I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 33;
    }
    // 循环发送: 数据
    for (uint8_t i = 0; i < len; i++)
    {
        // 发送: 数据
        I2C_SendByte(buf[i]);
        // 接收: 应答
        if (I2C_ACK != I2C_WaitForAck())
        {
            I2C_Stop();
            return 34;
        }
    }
    // 发送: 停止
    I2C_Stop();
    return 0;
}

uint32_t EE_ReadSequential(uint8_t startAddr, uint8_t *buf, uint16_t len)
{
    // 发送: 起始信号
    I2C_Start();
    // 发送: 设备写地址
    I2C_SendByte(EE_DEVADDR_WRITE);
    // 接收: 应答
    if (I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 41;
    }
    // 发送: 数据地址(首地址)
    I2C_SendByte(startAddr);
    // 接收: 应答
    if (I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 42;
    }

    // 重复起始
    I2C_Start();
    I2C_SendByte(EE_DEVADDR_READ);
    if (I2C_ACK != I2C_WaitForAck())
    {
        I2C_Stop();
        return 43;
    }

    // 循环读取
    for (uint16_t i = 0; i < len; i++)
    {
        if (i == len - 1)
            buf[i] = I2C_RecvByte(I2C_NOACK); // 最后一个字节 NACK
        else
            buf[i] = I2C_RecvByte(I2C_ACK); // 其他字节 ACK
    }

    I2C_Stop();
    return 0;
}
